﻿#define _CRT_SECURE_NO_WARNINGS 1
//题目：区间覆盖
// 给定 N个闭区间[ai, bi]以及一个线段区间[s, t]，请你选择尽量少的区间，将指定线段区间完全覆盖。
//输出最少区间数，如果无法完全覆盖则输出 −1。
//输入格式
//第一行包含两个整数 s和 t，表示给定线段区间的两个端点。
//第二行包含整数 N，表示给定区间数。
//接下来 N行，每行包含两个整数 ai, bi，表示一个区间的两个端点。
//输出格式
//输出一个整数，表示所需最少区间数。
//如果无解，则输出 −1。
//数据范围
//1≤N≤105,−109≤ai≤bi≤109,−109≤s≤t≤109
//输入样例：
//1 5
//3
//- 1 3
//2 4
//3 5
//输出样例：
//2
//做题思路：
//1.将所有区间按左端点从小到大排序
//2.从前往后依次枚举每个区间，在所有能覆盖的start的区间中，选择右端点最大的区间，然后将start更新成右端点的最大值
//#include <iostream>
//#include <algorithm>
//
//using namespace std;
//
//const int N = 100010;
//
//int n;
//struct Range
//{
//    int l, r;
//    bool operator< (const Range& W)const
//    {
//        return l < W.l;
//    }
//}range[N];
//
//int main()
//{
//    int st, ed;
//    scanf("%d%d", &st, &ed);
//    scanf("%d", &n);
//    for (int i = 0; i < n; i++)
//    {
//        int l, r;
//        scanf("%d%d", &l, &r);
//        range[i] = { l, r };
//    }
//
//    sort(range, range + n);
//
//    int res = 0;
//    bool success = false;
//    for (int i = 0; i < n; i++)
//    {
//        //因为r没更新为-2e9 导致st和r相等 如果出现while中条件不成立的情况 j无法++最后i又等于j-1（相当于i一直不变） 
//        //又不能通过r<st来跳出循环（如果r更新为-2e9 就能在这里跳出循环） 所以一直死循环
//        int j = i, r = -2e9;
//        while (j < n && range[j].l <= st)
//        {
//            r = max(r, range[j].r);
//            j++;
//        }
//
//        if (r < st)
//        {
//            res = -1;
//            break;
//        }
//
//        res++;
//        if (r >= ed)
//        {
//            success = true;
//            break;
//        }
//
//        st = r;
//        i = j - 1;
//    }
//
//    if (!success) res = -1;
//    printf("%d\n", res);
//
//    return 0;
//}

////题目：合并果子
// 在一个果园里，达达已经将所有的果子打了下来，而且按果子的不同种类分成了不同的堆。
//达达决定把所有的果子合成一堆。
//每一次合并，达达可以把两堆果子合并到一起，消耗的体力等于两堆果子的重量之和。
//可以看出，所有的果子经过 n−1次合并之后，就只剩下一堆了。
//达达在合并果子时总共消耗的体力等于每次合并所耗体力之和。
//因为还要花大力气把这些果子搬回家，所以达达在合并果子时要尽可能地节省体力。
//假定每个果子重量都为 1，并且已知果子的种类数和每种果子的数目，你的任务是设计出合并的次序方案，使达达耗费的体力最少，并输出这个最小的体力耗费值。
//例如有 3种果子，数目依次为 1，2，9。
//可以先将 1、2堆合并，新堆数目为 3，耗费体力为 3。
//接着，将新堆与原先的第三堆合并，又得到新的堆，数目为 12，耗费体力为 12。
//所以达达总共耗费体力 = 3 + 12 = 15。
//可以证明 15为最小的体力耗费值。
//输入格式
//输入包括两行，第一行是一个整数 n，表示果子的种类数。
//第二行包含 n个整数，用空格分隔，第 i个整数 ai是第 i种果子的数目。
//输出格式
//输出包括一行，这一行只包含一个整数，也就是最小的体力耗费值。
//输入数据保证这个值小于 231。
//数据范围
//1≤n≤10000,1≤ai≤20000
//输入样例：
//3
//1 2 9
//输出样例：
//15
//解题思路：哈夫曼树
#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;
int n;
int main()
{
    cin >> n;
    priority_queue<int, vector<int>, greater<int>>heap;
    while (n--)
    {
        int x;
        cin >> x;
        heap.push(x);
    }
    int res = 0;
    while (heap.size() > 1)
    {
        //每次合并最小的
        int a = heap.top(); heap.pop();
        int b = heap.top(); heap.pop();
        res += a + b;
        heap.push(a + b);//插入合并后的值
    }
    cout << res << endl;
    return 0;
}